/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package chatsoft.client.buz;

import ChatSoft.model.ServerInfo;
import chatsoft.client.voicechat.Tx;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.TargetDataLine;

/**
 *
 * @author VinhThien
 */
public class ReceiveVoiceBusiness extends Thread {
    boolean stopCapture = false;
    ByteArrayOutputStream byteArrayOutputStream;
    AudioFormat audioFormat;
    TargetDataLine targetDataLine;
    AudioInputStream audioInputStream;
    BufferedOutputStream out = null;
    BufferedInputStream in = null;
    Socket sock = null;
    SourceDataLine sourceDataLine;

    public ReceiveVoiceBusiness(Socket sock) {
        this.sock = sock;
    }
    
    public void captureAudio() {
        try {

            out = new BufferedOutputStream(sock.getOutputStream());
            in = new BufferedInputStream(sock.getInputStream());

            Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
            System.out.println("Available mixers:");
            for (int cnt = 0; cnt < mixerInfo.length; cnt++) {
                System.out.println(mixerInfo[cnt].getName());
            }
            audioFormat = getAudioFormat();

//            DataLine.Info dataLineInfo = new DataLine.Info(
//                    TargetDataLine.class, audioFormat);
//
//            Mixer mixer = AudioSystem.getMixer(mixerInfo[3]);

//            targetDataLine = (TargetDataLine) mixer.getLine(dataLineInfo);

//            targetDataLine.open(audioFormat);
//            targetDataLine.start();

//            Thread captureThread = new ReceiveVoiceBusiness.CaptureThread();
//            captureThread.start();

            DataLine.Info dataLineInfo1 = new DataLine.Info(
                    SourceDataLine.class, audioFormat);
            sourceDataLine = (SourceDataLine) AudioSystem
                    .getLine(dataLineInfo1);
            sourceDataLine.open(audioFormat);
            sourceDataLine.start();

            Thread playThread = new ReceiveVoiceBusiness.PlayThread();
            playThread.start();

        } catch (Exception e) {
            System.out.println(e);
            System.exit(0);
        }
    }

                        
//    public class CaptureThread extends Thread {
//
//        byte tempBuffer[] = new byte[10000];
//
//        public void run() {
//            byteArrayOutputStream = new ByteArrayOutputStream();
//            stopCapture = false;
//            try {
//                while (!stopCapture) {
//
//                    int cnt = targetDataLine.read(tempBuffer, 0,
//                            tempBuffer.length);
//
//                    out.write(tempBuffer);
//
//                    if (cnt > 0) {
//
//                        byteArrayOutputStream.write(tempBuffer, 0, cnt);
//
//                    }
//                }
//                byteArrayOutputStream.close();
//            } catch (Exception e) {
//                System.out.println(e);
//                System.exit(0);
//            }
//        }
//    }

    private AudioFormat getAudioFormat() {
        float sampleRate = 8000.0F;

        int sampleSizeInBits = 16;

        int channels = 1;

        boolean signed = true;

        boolean bigEndian = true;

        return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,
                bigEndian);
    }

    public class PlayThread extends Thread {

        byte tempBuffer[] = new byte[10000];

        public void run() {
            try {
                while (in.read(tempBuffer) != -1) {
                    sourceDataLine.write(tempBuffer, 0, 10000);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
